package com.hmdp.service.impl;

import cn.hutool.json.JSONUtil;
import com.hmdp.dto.Result;
import com.hmdp.entity.ShopType;
import com.hmdp.mapper.ShopTypeMapper;
import com.hmdp.service.IShopTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.utils.RedisConstants;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author: YJY
 * @since 2025-03-10
 */
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {

    @Resource
    StringRedisTemplate stringRedisTemplate;

    /*
    整体代码都是类似的，前面只需要将单个店铺信息从JSON和Bean之间相互转换
这里只不过是将查询到的多个店铺类型信息从JSON和Bean之间相互转换，只是多了一个foreach循环
     */
    @Override
    public Result queryTypeList() {
        //1.在缓存中查询
        List<String>shopTypes = stringRedisTemplate.opsForList().range(RedisConstants.CACHE_SHOP_TYPE,0,-1);
        if(!shopTypes.isEmpty()){
            // 有缓存
            // JSON传递过来 我们要List传递出去
            List<ShopType> tmp = new ArrayList<>();
            for (String types : shopTypes) {
                ShopType shopType = JSONUtil.toBean(types, ShopType.class);
                tmp.add(shopType);
            }
            return Result.ok(tmp);
        }
        //否则去数据库查询
        List<ShopType> tmp = query().orderByAsc("sort").list();
        if(tmp == null) {
            return Result.fail("商铺类型不存在!");
        }
        //查到了直接转为json字符串,存入redis
        for (ShopType shopType : tmp) {
            String jsonStr = JSONUtil.toJsonStr(shopType);
            shopTypes.add(jsonStr);
        }
        stringRedisTemplate.opsForList().leftPushAll(RedisConstants.CACHE_SHOP_TYPE,shopTypes);
        //最终把查询到的商户分类信息返回给前端
        return Result.ok(tmp);
    }

    public Result queryListStream() {
        // 先从Redis中查，这里的常量值是固定前缀 + 店铺id
        List<String> shopTypes =
                stringRedisTemplate.opsForList().range(RedisConstants.CACHE_SHOP_TYPE, 0, -1);
        // 如果不为空（查询到了），则转为ShopType类型直接返回
        if (!shopTypes.isEmpty()) {
            List<ShopType> tmp = shopTypes.stream().map(type -> JSONUtil.toBean(type, ShopType.class))
                    .collect(Collectors.toList());
            return Result.ok(tmp);
        }
        // 否则去数据库中查
        List<ShopType> tmp = query().orderByAsc("sort").list();
        if (tmp == null){
            return Result.fail("店铺类型不存在！！");
        }
        // 查到了转为json字符串，存入redis
        shopTypes = tmp.stream().map(type -> JSONUtil.toJsonStr(type))
                .collect(Collectors.toList());
        stringRedisTemplate.opsForList().leftPushAll(RedisConstants.CACHE_SHOP_TYPE,shopTypes);
        // 最终把查询到的商户分类信息返回给前端
        return Result.ok(tmp);
    }
}
